export default function debounce(fn, delay = 500, immediate = false, resultCallback) {
    // 1.定义一个定时器, 保存上一次的定时器
    let timer = null
    let isInvoke = false
  
    // 2.真正执行的函数
    const _debounce = function(...args) {
      return new Promise((resolve, reject) => {
        // 取消上一次的定时器
        if (timer) clearTimeout(timer)
  
        // 判断是否需要立即执行
        if (immediate && !isInvoke) {
          const result = fn.apply(this, args)
          if (resultCallback) resultCallback(result)
          resolve(result)
          isInvoke = true
        } else {
          // 延迟执行
          timer = setTimeout(() => {
            // 外部传入的真正要执行的函数
            const result = fn.apply(this, args)
            if (resultCallback) resultCallback(result)
            resolve(result)
            isInvoke = false
            timer = null
          }, delay)
        }
      })
    }
  
    // 封装取消功能
    _debounce.cancel = function() {
      console.log(timer)
      if (timer) clearTimeout(timer)
      timer = null
      isInvoke = false
    }
  
    return _debounce
  }
  
  